package cn.cai.service.impl;

import cn.cai.exceptionHandler.GuliException;
import cn.cai.utils.MinioAdmin;
import io.minio.*;
import io.minio.messages.Item;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import cn.cai.service.VideoService;
import java.io.InputStream;
import java.util.*;

@Service
public class VideoServiceImpl implements VideoService {
    /**
     * 视频文件的上传
     * @param uploadFile 要进行上传的文件
     * @return videoID  返回随机生成的文件的id（同时也是视频的文件名）（无法判断视频文件的类型）
     */
    @Override
    public String uploadVideo(MultipartFile uploadFile) {
        //获取到用户上传的视频的原名
        String originalFilename = uploadFile.getOriginalFilename();
        InputStream inputStream = null;
        //将文件以流的形式上传到minio云服务器
        try {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(MinioAdmin.ENDPOINT)
                            .credentials(MinioAdmin.ACCESSKEY, MinioAdmin.SECRETKEY)
                            .build();
            //以流的形式进行上传
            inputStream = uploadFile.getInputStream();
            long size = uploadFile.getSize();
            //生成随机且唯一的文件名
            //返回文件的真实文件名
            StringBuffer randomFileName = new StringBuffer();
            // 随机生成10为随机数
            randomFileName.append(UUID.randomUUID().toString().replace("-","").toUpperCase().substring(0,10));
            randomFileName.append(originalFilename);
            minioClient.putObject(PutObjectArgs.builder()
                            .bucket("video")
                            .object(randomFileName.toString())
                            .stream(inputStream,size,-1)
                            .build());
            //关闭流
            inputStream.close();
            //得到上传视频的url地址
//            String url = minioClient.presignedGetObject("video", randomFileName.toString());
//            String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
//                    .method(Method.GET)
//                    .bucket("video")
//                    .object(randomFileName.toString())
//                    .build());
            //返回的是文件名
            return randomFileName.toString();
        } catch (Exception e) {
            e.printStackTrace();
            throw new GuliException(20001,"服务器打开失败");
        }

    }

    /**
     * 根据视频的id删除视频资源
     * --TODO 根据url分析
     * @param videoId 要删除视频的id
     * @return 是否删除，true:删除成功，false:删除失败
     */
    @Override
    public void deleteVideoById(String videoId) {
        try {
            MinioClient minioClient =
                    MinioClient.builder()
                            .endpoint(MinioAdmin.ENDPOINT)
                            .credentials(MinioAdmin.ACCESSKEY, MinioAdmin.SECRETKEY)
                            .build();
            //TODO  使用minioSDK 对视频服务器中指定的视频资源进行删除
            //根据视频ID，删除云服务器中的文件
            //查询video中的所有Object
            Set<String> fileList = new HashSet<>();
            for (Result<Item> itemResult : minioClient.listObjects(ListObjectsArgs.builder().bucket("video").build())) {
                fileList.add(itemResult.get().objectName());
            }
            for (String name:fileList){
                if(name.equals(videoId)){
                    //删除服务器中的文件
                    minioClient.removeObject(
                            RemoveObjectArgs
                                    .builder()
                                    .bucket("video")
                                    .object(videoId)
                                    .build());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new GuliException(20001,"服务器出错");
        }

    }
}
